昨天我們介紹了基本型別,今天要進一步學會 Union Type(聯合型別) 和 Enum(列舉)。
這次一樣用「搭火車」的例子 🚄,讓程式碼更貼近生活!
Union 的特色是用 | 將多種可能型別區分開來。
當一個值可能有「多種型別」時,Union 非常好用。
let ticketId: number | string;
ticketId = 12345;   // 數字型票號
ticketId = "A12";  // 字串型票號
// ticketId = true; // ❌ 編譯錯誤
在使用 Union 時,我們通常需要用 typeof 來判斷型別後再操作,避免出錯。
function printTicketId(id: number | string) {
  if (typeof id === "string") {
    console.log("票號(字串):" + id.toUpperCase());
  } else {
    console.log("票號(數字):" + id);
  }
}
printTicketId(12345);
printTicketId("b23");
type PaymentMethod = "Cash" | "CreditCard" | "MobilePay";
let payment: PaymentMethod;
payment = "Cash";       // ✅
payment = "MobilePay";  // ✅
// payment = "Coupon";  // ❌ 不在定義範圍
Enum 適合定義「固定範圍內的值」,比 Union 更有「名稱 → 值」的對應關係。
enum TicketStatus {
  NotBought,   // 尚未購買
  Bought,      // 已購票
  Used,        // 已使用
  Expired      // 已過期
}
let myTicket: { passenger: string; status: TicketStatus } = {
  passenger: "Arvin",
  status: TicketStatus.Bought,
};
console.log(myTicket);
let passengers: { name: string; status: TicketStatus }[] = [];
function addPassenger(name: string) {
  passengers.push({
    name: name,
    status: TicketStatus.NotBought,
  });
}
addPassenger("Alice");
addPassenger("Bob");
console.log(passengers);
enum TrainClass {
  Express = "自強號",
  Local = "區間車",
  HighSpeed = "高鐵"
}
function printTrainClass(c: TrainClass) {
  console.log("列車種類:" + c);
}
printTrainClass(TrainClass.Express);
👉 明天(Day 5)我們會介紹 interface 和 type,讓我們的火車旅程更結構化! 🚉